动态内存分配 (new 和 delete)

概述

在C++中,动态内存分配是指在程序运行时根据需要分配和释放内存的过程。这与静态内存分配不同,静态内存分配在编译时就已经确定了内存的大小。动态内存分配允许程序在运行时根据需要创建和销毁对象,从而提高内存使用的灵活性和效率。

C++提供了两个关键字new和delete来实现动态内存分配和释放。new用于分配内存并构造对象,delete用于销毁对象并释放内存。

1. new 关键字

1.1 基本用法

new关键字用于在堆上分配内存,并返回指向该内存的指针。基本语法如下:

Type* pointer = new Type;

其中,Type是数据类型,pointer是指向该类型的指针。

1.2 示例代码

#include <iostream>

int main() {
    int* pInt = new int;  // 分配一个int类型的内存
    *pInt = 10;           // 给分配的内存赋值
    std::cout << *pInt << std::endl;  // 输出10
    delete pInt;          // 释放内存
    return 0;
}

1.3 分配数组

new还可以用于分配数组,语法如下:

Type* pointer = new Type[size];

其中,size是数组的大小。

1.4 示例代码

#include <iostream>

int main() {
    int* pArray = new int[5];  // 分配一个包含5个int的数组
    for (int i = 0; i < 5; ++i) {
        pArray[i] = i * 10;
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << pArray[i] << " ";
    }
    std::cout << std::endl;
    delete[] pArray;  // 释放数组内存
    return 0;
}

2. delete 关键字

2.1 基本用法

delete关键字用于释放由new分配的内存。基本语法如下:

delete pointer;

其中,pointer是指向动态分配内存的指针。

2.2 示例代码

#include <iostream>

int main() {
    int* pInt = new int;
    *pInt = 10;
    std::cout << *pInt << std::endl;
    delete pInt;  // 释放内存
    return 0;
}

2.3 释放数组

释放数组内存时,需要使用delete[],语法如下:

delete[] pointer;

2.4 示例代码

#include <iostream>

int main() {
    int* pArray = new int[5];
    for (int i = 0; i < 5; ++i) {
        pArray[i] = i * 10;
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << pArray[i] << " ";
    }
    std::cout << std::endl;
    delete[] pArray;  // 释放数组内存
    return 0;
}

3. 内存泄漏

3.1 什么是内存泄漏

内存泄漏是指程序在动态分配内存后,未能正确释放该内存,导致内存资源被浪费。内存泄漏会导致程序的内存使用量逐渐增加,最终可能导致程序崩溃。

3.2 示例代码

#include <iostream>

int main() {
    int* pInt = new int;
    *pInt = 10;
    std::cout << *pInt << std::endl;
    // 忘记释放内存
    return 0;
}

3.3 避免内存泄漏

为了避免内存泄漏,应该始终确保在动态分配内存后,使用delete或delete[]释放内存。

4. 实践练习

4.1 练习1:动态分配和释放单个对象

编写一个程序,动态分配一个double类型的内存,并将其初始化为3.14,然后输出该值,最后释放内存。

4.2 练习2:动态分配和释放数组

编写一个程序,动态分配一个包含10个float类型的数组,并将其初始化为0.0到9.0,然后输出数组中的所有值,最后释放数组内存。

4.3 练习3:避免内存泄漏

修改以下代码,确保在程序结束前释放所有动态分配的内存。

#include <iostream>

int main() {
    int* pInt = new int;
    *pInt = 10;
    std::cout << *pInt << std::endl;
    // 忘记释放内存
    return 0;
}

5. 总结

动态内存分配是C++中一个强大的特性,允许程序在运行时根据需要分配和释放内存。通过使用new和delete,可以有效地管理内存资源,避免内存泄漏。然而,动态内存管理也需要谨慎,确保在适当的时候释放内存,以避免资源浪费和程序崩溃。

通过本教程的学习,你应该能够理解动态内存分配的基本概念,并能够在实际编程中正确使用new和delete。